foto de data
foto de data

Planteamiento de la Investigación

1.Planteamiento del problema

La cantidad de películas y series que hay en Netflix son miles y de distintos géneros, países y años de lanzamiento. Sin embargo, hay algunas producciones que alcanzan alta popularidad y son ampliamente recomendadas, mientras que otras a pesar de tener buena calidad y alta valoración reciben menos atención del público. Este desequilibrio motiva a la pregunta de ¿qué características del contenido son las que influyen en la visibilidad y éxito de las producciones de la plataforma, cómo pueden identificarse y promoverse aquellas obras de alta calidad que pasan desapercibidas?

El problema principal radica en que gran parte del consumo de los usuarios proviene de sistemas de recomendación automatizados, los cuales tienden a favorecer los títulos que ya son populares. Éste fenómeno crea un ciclo de visibilidad desigual, donde las producciones con menores posición inicial permanecen ocultas y no logran alcanzar al público potencial, reduciendo la diversidad del consumo audiovisuaL.

Ante esta situación, se prefiere escoger un enfoque empírico a partir de información concreta obtenida del dataset, aplicando limpieza, análisis exploratorio multivariado y criterios reproducibles para rankear posibles gemas, buscando observar patrones y resultados reales. La propuesta busca analizar los datos del catálogo para identificar los factores que determinan la popularidad o invisibilidad de una producción, y detectar de forma efectiva las “gemas ocultas“, es decir, aquellas películas y series con buenas valoraciones pero baja popularidad.

Objetivos

Objetivo general

Analizar los datos del catálogo de Netflix para identificar los factores relacionados a la popularidad y visibilidad de las producciones e identificar un conjunto reproducible de “gemas ocultas”.

Objetivos específicos

  1. Realizar la carga y limpieza reproducible del dataset base, asegurando nombres consistentes y formatos adecuados (fechas, duración, géneros).

  2. Analizar cómo ha sido la evolución temporal de las incorporaciones al catálogo y las tendencias del tipo de contenido (Movie vs TV Show).

  3. Proponer y aplicar un criterio reproducible para identificar las 20 “gemas ocultas”.

Marco metodológico

Enfoque de la investigación

El enfoque es cuantitativo y descriptivo. Con el objetivo principal de medir y explicar relaciones entre variables numéricas y cualitativas; además, las elecciones de umbral de gemas, manejo de outliers, dependen de estadísticas reproducibles y cuantificables.

Tipo de investigación

La investigación es descriptiva y correlacional con elementos exploratorios, se enfoca en describir el catálogo, explorar distintas variables y analizar asociaciones y tendencias temporales que podrán servir de base para trabajos predictivos futuros.

Periodo de referencia

El periodo de análisis viene de las fechas disponibles en date_added y release_year. Se sugiere usar todo el rango disponible en el dataset para maximizar la inferencia histórica, y subanálisis por década para mejorar interpretabilidad. La elección por décadas facilita comparaciones históricas sin suponer continuidad mensual uniforme.

Procesamiento y análisis de datos (pasos reproducibles)

  1. Carga de librerías y dataset

  2. clean_names() para uniformizar nombres.

  3. Renombrado condicional (soportar esquema en inglés y el script provisto en español).

  4. Normalización de duration (extraer minutos para películas; extraer número de temporadas para series).

  5. Separación de listed_in/genres y country/production_countries con separate_rows().

  6. Manejo de valores faltantes (NA) en clasificaciones y descripciones, detección de duplicados y eliminación basada en título.

  7. Detección de outliers (IQR) y creación de versiones filtradas para análisis sensibles a valores extremos.

  8. Cálculos descriptivos, agrupamientos y gráficas con ggplot2.

library(readr)
library(dplyr)
library(ggplot2)
library(tidyr)
library(here)
library(stringr)
library(dplyr)
library(knitr)


netflix_data <- read_csv("netflix_dataset.csv")

# Cambiar títulos al español

netflix1 <- netflix_data %>%
  rename(
    ID = id,
    Titulos_producciones = title,
    Tipos = type,
    Descripcion = description, 
    Año_Lanzamiento = release_year,
    Certificacion_edad = age_certification,
    Tiempo = runtime,
    Generos = genres,
    Paises_produccion = production_countries,
    Temporadas = seasons,
    imdb_ID = imdb_id,
    imdb_votos = imdb_votes,
    tmdb_popularidad = tmdb_popularity,
    tmdb_puntaje = tmdb_score
  ) 
  
##Para la clasificación de edad se nombra como "No clasificados" los valores NA
netflix_limpio <-netflix1 %>%
  mutate(
    Certificacion_edad = case_when(
      is.na(Certificacion_edad)~"No Clasificado", 
      TRUE ~ Certificacion_edad)
  )

##Para la descripción cambiar los datos NA como "no disponibles"

netflix_limpio <-netflix_limpio %>%
  mutate(
    Descripcion = case_when(
      is.na(Descripcion)~"No disponible", 
      TRUE ~ Descripcion)
  )

###Se reemplazan con "0" los ID , Score, votos, popularidad de las paginas imdb y tmdb que aparezcan en NA
netflix_limpio <- netflix_limpio %>%
  mutate(
    tmdb_popularidad = ifelse(is.na(tmdb_popularidad), 0, tmdb_popularidad),
    tmdb_puntaje = ifelse(is.na(tmdb_puntaje), 0, tmdb_puntaje) ,
    imdb_score = ifelse(is.na(imdb_score), 0, imdb_score) ,
    imdb_votos = ifelse(is.na(imdb_votos), 0, imdb_votos) ,
    imdb_ID = ifelse(is.na(imdb_ID), "desconocido",imdb_ID)
  )


#Seasons: como los valores Na de esa categoria, significa que es una pelicula, entonces cambiaremos el valor NA por 0
  netflix_limpio <- netflix_limpio %>%
  mutate(
    Temporadas = ifelse(is.na(Temporadas), 0, Temporadas)
  )

#Borramos los titulos faltantes de la data
  
netflix_limpio <- netflix_limpio %>%
    filter(!is.na(Titulos_producciones))
#Eliminación de duplicados

netflix_limpio <- netflix_limpio %>%
  distinct(Titulos_producciones, .keep_all = TRUE)  


#Limpieza de datos 

netflix_limpio <- netflix_limpio %>%
  mutate(
    #Filtrar años inválidos
    Año_Lanzamiento = case_when(
      Año_Lanzamiento < 1700 | Año_Lanzamiento > 2025 ~ NA_real_,
      TRUE ~ Año_Lanzamiento
    ),
    # Filtrar tiempos de reproducción incongruentes 
    Tiempo = case_when(
      Tiempo < 1 | Tiempo > 300 ~ NA_real_, 
      TRUE ~ Tiempo
    ))

#Limpiar String con comas y doble espacios

netflix_limpio <- netflix_limpio %>%
  mutate(
    Generos = str_trim(str_replace_all(Generos, ",\\s+", ", ")),  
         Paises_produccion = str_trim(str_replace_all(Paises_produccion, ",\\s+", ", "))
  )

 
##Crear columnas para los géneros
netflix_limpio <- netflix_limpio %>%
  mutate(
    Generos_Lista = str_split(Generos, ",\\s*") 
  )

netflix_limpio <- netflix_limpio %>%
  separate_rows(Generos, sep = ",\\s*")

netflix_limpio <- netflix_limpio %>%
  mutate(
    Paises_produccion = str_to_lower(Paises_produccion),
    Paises_produccion = str_replace_all(Paises_produccion, "\\$|\\$|'", ""),
    Paises_produccion = str_trim(Paises_produccion)
  ) %>%
  separate_rows(Paises_produccion, sep = ",\\s*")

options(encoding = "UTF-8")
Sys.setlocale("LC_ALL", "es_ES.UTF-8")
## [1] "LC_COLLATE=es_ES.UTF-8;LC_CTYPE=es_ES.UTF-8;LC_MONETARY=es_ES.UTF-8;LC_NUMERIC=C;LC_TIME=es_ES.UTF-8"
#Paso 2: Crear variables y organizar la data de la manera necesaria para realizar la investigación
  ##Creamos una varible sobre Decadas 
  netflix_limpio<- netflix_limpio%>%
  mutate(
    decada = case_when(
      Año_Lanzamiento < 1950 ~ "1940´s",
      Año_Lanzamiento < 1960 ~ "1950´s",
      Año_Lanzamiento < 1970 ~ "1960´s",
      Año_Lanzamiento < 1980 ~ "1970´s",
      Año_Lanzamiento < 1990 ~ "1980's",
      Año_Lanzamiento < 2000 ~ "1990's",
      Año_Lanzamiento < 2010 ~ "2000's",
      Año_Lanzamiento < 2020 ~ "2010´s",
      Año_Lanzamiento >= 2020 ~ "2020's"
    )
  )

  
  ##Creamos dos tablas, una con la información de imdb y otra con la información de tmdb

vars_tmdb <- c("ID", "Titulos_producciones", "Tipos", "Año_Lanzamiento", "Temporadas", "Tiempo", "Certificacion_edad", "Generos", "Paises_produccion",
               "tmdb_popularidad", "tmdb_puntaje", "decada")

netflix_tmdb <- netflix_limpio %>%
  select(all_of(vars_tmdb))

netflix_tmdb_pelis <- netflix_tmdb %>%
  filter(Tipos == "MOVIE")

##Filtrar las películas y series de las tablas de tmdb


###Tablas de películas y series para tmdb

netflix_tmdb_pelis <- netflix_tmdb %>%
  filter(Tipos == "MOVIE")

netflix_tmdb_series <- netflix_tmdb %>%
  filter(Tipos == "SHOW")


#Mejoras, por si acaso, antes de realizar las estadisticas
netflix_limpio <- netflix_limpio %>%
  mutate(across(c(Tiempo, tmdb_popularidad, tmdb_puntaje), as.numeric))
netflix_limpio

Resultados y Análisis

Analisis general del catalogo de Netflix

1. Variables Cuantitativas

Se analizaron cinco variables cuantitativas clave: Año_Lanzamiento, Tiempo, Temporadas, tmdb_popularidad y tmdb_puntaje. A continuación, se presentan los principales estadísticos descriptivos:

# Seleccionar variables cuantitativas
vars_cuantitativas <- netflix_limpio %>%
  select(Año_Lanzamiento, Tiempo, tmdb_popularidad, tmdb_puntaje)

# Calcular estadísticos descriptivos
resumen_estadistico <- vars_cuantitativas %>%
  summarise(
    Media = sapply(., mean, na.rm = TRUE),
    Mediana = sapply(., median, na.rm = TRUE),
    Minimo = sapply(., min, na.rm = TRUE),
    Maximo = sapply(., max, na.rm = TRUE),
    Q1 = sapply(., function(x) quantile(x, 0.25, na.rm = TRUE)),
    Q3 = sapply(., function(x) quantile(x, 0.75, na.rm = TRUE)),
    Rango_Intercuartil = Q3 - Q1
  )

# Transponer la tabla
resumen_estadistico <- t(resumen_estadistico)
colnames(resumen_estadistico) <- colnames(vars_cuantitativas)

# Formatear según tipo de variable
resumen_estadistico_formateado <- resumen_estadistico
resumen_estadistico_formateado[, c("Año_Lanzamiento", "Tiempo")] <- 
  round(as.numeric(resumen_estadistico_formateado[, c("Año_Lanzamiento", "Tiempo")]), 0)

resumen_estadistico_formateado[, c("tmdb_popularidad", "tmdb_puntaje")] <- 
  round(as.numeric(resumen_estadistico_formateado[, c("tmdb_popularidad", "tmdb_puntaje")]), 2)

# Mostrar tabla con kable
kable(resumen_estadistico_formateado, caption = "Resumen estadístico de variables cuantitativas del catálogo de Netflix")
Resumen estadístico de variables cuantitativas del catálogo de Netflix
Año_Lanzamiento Tiempo tmdb_popularidad tmdb_puntaje
Media 2016 80 28.69 6.62
Mediana 2018 90 9.73 6.90
Minimo 1945 2 0.00 0.00
Maximo 2022 240 2274.04 10.00
Q1 2015 45 3.75 6.10
Q3 2020 107 22.82 7.50
Rango_Intercuartil 5 62 19.08 1.40

Con estos datos, se puede comprender diversos datos importante para el conocimiento de la data:

Año de Lanzamiento El análisis de esta variable revela una fuerte concentración en contenido contemporáneo. La mediana en 2018 y la media en 2016, sugieren que la mitad de las producciones más recientes se han estrenado en 2018 o posteriormente.El rango intercuartílico pequeño (5 años) refleja que la mayoría de producciones se concentran entre 2015 y 2020. La presencia de valores atípicos (outliers), representados por producciones muy antiguas o muy recientes, explica la dispersión fuera de este intervalo, pero no alteran la tendencia central del catálogo.

Tiempo de Duración (Películas) Las películas presentan un tiempo promedio de 80 minutos y mediana de 90 minutos, lo que refleja que predominan producciones de una duracion estandar, ni muy cortas ni excesivamente largas. La diferencia entre mínimo y máximo indica la existencia de outliers (películas extremadamente cortas o muy extensas).

Popularidad TMDB El puntaje promedio de 28.69 es significativamente superior a la mediana de 9.73, lo que indica una distribución sesgada a la derecha.Este patrón estadístico coincide con la realidad de la plataforma, donde un conjunto de grandes éxitos globales destaca notablemente sobre la popularidad general del catálogo.

Puntaje TMDB Los puntajes muestran una valoración más consistente y homogénea del contenido. La mediana (6.9) se encuentra muy próxima a la media (6.62), lo que implica que los puntajes de las producciones se concentran de manera estrecha alrededor de estos valores medios. El rango intercuartílico de 1.4 confirma esta baja dispersión, sugiriendo que la mayoría de las producciones obtienen calificaciones de calidad relativamente similares. Esta consistencia indica que el catálogo mantiene un umbral de calidad homogéneo.

2. Variables Categóricas

Tipo de contenido

Tipos_grafic <- netflix_limpio %>%
  group_by(Tipos) %>%
  summarise( Count = n(), .groups = "drop")%>%
  mutate(Porcentaje = round(Count / sum(Count)*100, 2))

grafico_tipos_pie <- ggplot(Tipos_grafic, aes(x ="", y= Count, fill = Tipos)) +
  geom_bar(stat = "identity", width = 1, color = "white")+
  geom_text(aes(label = paste0(Porcentaje, "%")),
            color = "white", size = 5)+
  scale_fill_manual( values = c( "MOVIE" ="#931B26", "SHOW" = "#37020D"))+
  coord_polar(theta = "y")+
  labs(
    title = "Distribucion de peliculas y series",
    fill = "Tipo"
  )+
  theme_minimal()

print(grafico_tipos_pie)

Películas (MOVIE) representan aproximadamente el 65.22% del catálogo.

Series (SHOW) representan el 34.78%.

Esto muestra un predominio claro de películas, aunque el porcentaje de series sigue siendo significativo.

netflix_limpio <- netflix_limpio %>%
  mutate(
    Generos = str_to_lower(Generos),                     
    Generos = str_replace_all(Generos, "\\[|\\]|'", ""),
    Generos = str_trim(Generos)                          
  ) %>%
  separate_rows(Generos, sep = ",\\s*")


conteo_generos <- netflix_limpio%>%
  group_by(Generos) %>%
  summarise(Conteo = n(), .groups = "drop") %>%
  mutate(Porcentaje = round(Conteo / sum(Conteo)*100, 2))


grafico_generos <- ggplot(conteo_generos, aes(x = reorder(Generos, Conteo), y = Conteo, fill = Generos)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  scale_fill_manual( values = c( "action" ="#931B26",
                                 "animation" = "#37020D",
                                 "comedy" = "#7B0003",
                                 "fantasy"= "#290F04", 
                                 "thriller"= "#610013",
                                 "scifi"= "#185ACC", 
                                 "drama" = "#FA030B",
                                 "family"= "#110075", 
                                 "music"= "#1495EA",
                                 "horror"= "#5870F4", 
                                 "crime"= "#60000F",
                                 "european"= "#AB000F",
                                 "documentarion"= "",
                                 "history"="#F2000F",
                                 "reality"="#F2000F",
                                 "romance"= "#6490DE",
                                 "sport"= "#273857",
                                 "war"= "#F57169",
                                 "western"="#8F413D"))+
  
  labs(
    title = "Cantidad de producciones por género",
    x = "Género",
    y = "Número de producciones"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.y = element_text(size = 10)
  )
print(grafico_generos)

Los géneros más frecuentes en el catálogo son:

1.Drama

2.Comedy

3.Thriller

4.Action

5.Romance

Esto muestra que Netflix apuesta por géneros populares y de amplio alcance, mientras que géneros más especializados (e.g., Western, Music, History) son menoress. Esta distribución también explica patrones de éxito: los géneros más frecuentes tienden a generar mayor cantidad de producciones con alto puntaje promedio.

Analisis de exitos

Análisis general de los patrones de éxito en el catálogo de Netflix

El análisis busca identificar los factores asociados al éxito de las producciones del catálogo, medido principalmente a través de las variables tmdb_popularidad (popularidad) y tmdb_puntaje (calificación). Para ello, se se elaboraron visualizaciones comparativas por década, tipo de contenido, duración, género y país de origen.

1.Popularidad por género y década

# Calcular la popularidad promedio por género (solo películas)
top10_generos <- netflix_tmdb_pelis %>%
  group_by(Generos) %>%
  summarise(popularidad_promedio = mean(tmdb_popularidad, na.rm = TRUE)) %>%
  arrange(desc(popularidad_promedio)) %>%
  slice_head(n = 10) %>%
  pull(Generos)

# Filtrar el dataset original solo con esos 20 géneros
netflix_tmdb_pelis_top10 <- netflix_tmdb_pelis %>%
  filter(Generos %in% top10_generos)

# Volver a graficar solo con esos géneros
genero_popularidad_pelis_top10 <- ggplot(netflix_tmdb_pelis_top10, 
                                         aes(x = decada, y = tmdb_popularidad, fill = Generos)) +
  geom_col(alpha = 0.85, color = "white") +
  scale_fill_manual(values = c("action" ="#931B26",
                               "animation" = "#37020D",
                               "comedy" = "#7B0003",
                               "fantasy"= "#290F04", 
                               "thriller"= "#610013",
                               "scifi"= "#185ACC", 
                               "drama" = "#FA030B",
                               "family"= "#110075", 
                               "music"= "#1495EA",
                               "horror"= "#5870F4", 
                               "crime"= "#60000F",
                               "european"= "#AB000F",
                               "documentary"= "#CF4C4C",
                               "history"="#F2000F",
                               "reality"="#F2000F",
                               "romance"= "#6490DE",
                               "sport"= "#273857",
                               "war"= "#F57169",
                               "western"="#8F413D")) +
  coord_flip() +
  labs(title = "Top 10 géneros más populares de películas por década en Netflix",
       subtitle = "Basado en la variable tmdb_popularidad",
       x = "Década",
       y = "Popularidad promedio",
       fill = "Género") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")

# Mostrar el gráfico
print(genero_popularidad_pelis_top10)
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
## No shared levels found between `names(values)` of the manual scale and the
## data's fill values.

Los gráficos de barras muestran la evolución del éxito por género a lo largo de las décadas, diferenciando entre películas y series:

El análisis de la popularidad promedio de los géneros revela una clara concentración de las películas más populares en las décadas recientes, principalmente la de 2010 y 2020, con las películas más antiguas prácticamente sin representación en los puntajes altos. Aunque la mayoría de los géneros se sitúan en un rango de popularidad promedio bajo, los picos más altos, que superan las 100.000 unidades, están impulsados consistentemente por géneros como Acción, Crimen, Animación y Ciencia Ficción.

# --- Calcular el top 10 de géneros más populares ---
top10_generos_series <- netflix_tmdb_series %>%
  group_by(Generos) %>%
  summarise(popularidad_promedio = mean(tmdb_popularidad, na.rm = TRUE)) %>%
  arrange(desc(popularidad_promedio)) %>%
  slice_head(n = 10) %>%
  pull(Generos)

# --- Filtrar dataset solo con esos géneros ---
netflix_tmdb_series_top10 <- netflix_tmdb_series %>%
  filter(Generos %in% top10_generos_series)

# --- Graficar ---
genero_popularidad_series_top10 <- ggplot(netflix_tmdb_series_top10 , aes(x = decada, y = tmdb_popularidad, fill = Generos)) +
  geom_col(alpha = 0.85, color = "white") +
  scale_fill_manual(values = c("action" ="#931B26",
                               "animation" = "#37020D",
                               "comedy" = "#7B0003",
                               "fantasy"= "#290F04", 
                               "thriller"= "#610013",
                               "scifi"= "#185ACC", 
                               "drama" = "#FA030B",
                               "family"= "#110075", 
                               "music"= "#1495EA",
                               "horror"= "#5870F4", 
                               "crime"= "#60000F",
                               "european"= "#AB000F",
                               "documentarion"= "",
                               "history"="#F2000F",
                               "reality"="#F2000F",
                               "romance"= "#6490DE",
                               "sport"= "#273857",
                               "war"= "#F57169",
                               "western"="#8F413D")) +
  coord_flip() +
  labs(title = "Popularidad promedio de las series por género y década en Netflix",
       subtitle = "Basado en la variable tmdb_popularidad",
       x = "Década",
       y = "Popularidad promedio",
       fill = "Género") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")

# --- Mostrar el gráfico ---
print(genero_popularidad_series_top10)
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's fill values.
## No shared levels found between `names(values)` of the manual scale and the
## data's fill values.

El análisis de las series en Netflix muestra una situación similar a la de las películas, con la popularidad promedio concentrada en las décadas de 2010 y 2020. El rango de popularidad es muy amplio, pero la mayoría de las series se agrupan en valores bajos (cerca de 0). Los picos de popularidad más altos, que superan las 50.000 unidades, están impulsados por géneros como Crimen, Drama y Acción, y de manera notoria, el género de Ciencia Ficción, que alcanza algunos de los valores más altos. Al igual que en las películas, las series de las décadas anteriores a 2000 tienen una popularidad promedio muy baja o nula.

En conjunto, los resultados indican que la diversificación de géneros ha sido clave en la expansión del catálogo, aunque los géneros narrativos clásicos siguen concentrando el mayor éxito.

3. Evolución temporal de la duración promedio

El gráfico de líneas que relaciona la duración promedio por tipo de contenido a lo largo de las décadas muestra una tendencia diferenciada

# Grafico de lineas
##------------------Calcular la duracion promedio por tipo de contenido
netflix_limpio %>%
  group_by(decada, Tipos) %>%
  summarise(duracion_promedio = mean(Tiempo, na.rm = TRUE)) %>%
  
  ggplot(aes(x = decada, y = duracion_promedio, color = Tipos, group = Tipos)) +
  geom_line(size = 1.2) +
  geom_point(size = 3, shape = 21, fill = "white", stroke = 1.2) +
  scale_x_discrete() +
  labs(title = "Evolución de la duración promedio por tipo de contenido",
       x = "Década", y = "Duración promedio", color = "Tipos") + 
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))
## `summarise()` has grouped output by 'decada'. You can override using the
## `.groups` argument.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Este gráfico de líneas muestra tendencias opuestas en la duración promedio del contenido a lo largo de las décadas. La duración promedio de las películas (línea roja) ha ido disminuyendo constantemente desde su punto máximo en los años 1960 (casi 140 minutos) hasta estabilizarse en torno a los 100 minutos en la actualidad. Por otro lado, la duración promedio de los episodios de las series (línea azul), aunque se mantuvo baja en los 80 y 90, ha experimentado un ligero pero constante aumento desde los 2000, sugiriendo que los episodios de series se han hecho un poco más largos recientemente, mientras que las películas son cada vez más cortas en promedio.

####4. Relación entre duración y popularidad

##----------------Calcular la duracion promedio y la popularidad de las pelis

duracion_popularidad_decada <- netflix_tmdb_pelis %>%
  group_by(decada) %>%
  summarise(
    duracion_promedio = mean(Tiempo, na.rm = TRUE),
    popularidad_promedio = mean(tmdb_popularidad, na.rm = TRUE),
    cantidad = n()
  )


ggplot(duracion_popularidad_decada, aes(x = duracion_promedio, y = popularidad_promedio)) +
  geom_point(aes(size = cantidad, color = decada), alpha = 0.8) +
  geom_smooth(method = "lm", se = FALSE, color = "white", linetype = "dashed") +
  labs(
    title = "Relación entre Duración Promedio y Popularidad de Películas",
    subtitle = "Cada punto representa una década y el tamaño indica cantidad de películas",
    x = "Duración promedio ",
    y = "Popularidad promedio ",
    size = "Cantidad de películas",
    color = "Década"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

#Correlacion del tiempo con la popularidad
correlacion_1 <- cor(netflix_tmdb_pelis$Tiempo, netflix_tmdb_pelis$tmdb_popularidad, use="complete.obs")

print(correlacion_1)
## [1] 0.02352746

Este diagrama de burbujas, que compara la duración promedio con la popularidad de las películas por década, revela que la mayor parte del catálogo de Netflix se concentra en el contenido más reciente y corto. Las burbujas más grandes, que representan la mayor cantidad de películas, corresponden a las décadas de 2010 y 2020; estas películas son las más cortas (cercanas a 100 minutos) y tienen una popularidad promedio baja a moderada. Por otro lado, las películas más antiguas (1960s y 1970s) tienen duraciones más largas (cercanas a 150 minutos) y, aunque su popularidad es variada, la cantidad de títulos es mínima, lo que demuestra que Netflix prioriza la cantidad de producciones actuales y de duración estándar sobre el contenido histórico más extenso.

El resultado \(r = 0.0235\) establece que no existe una relación lineal significativa entre la duración promedio de las películas y su nivel de popularidad. Al ser positivo, sugiere una relación lineal directa muy débil.En términos prácticos, el tiempo que dura una película (si son 90 o 150 minutos) no es un factor determinante para predecir qué tan popular será en la plataforma.

##----------------Calcular la duracion promedio y la popularidad de las pelis

duracion_popularidad_decada <- netflix_tmdb_series %>%
  group_by(decada) %>%
  summarise(
    duracion_promedio = mean(Tiempo, na.rm = TRUE),
    popularidad_promedio = mean(tmdb_popularidad, na.rm = TRUE),
    cantidad = n()
  )


ggplot(duracion_popularidad_decada, aes(x = duracion_promedio, y = popularidad_promedio)) +
  geom_point(aes(size = cantidad, color = decada), alpha = 0.8) +
  geom_smooth(method = "lm", se = FALSE, color = "white", linetype = "dashed") +
  labs(
    title = "Relación entre Duración Promedio y Popularidad de Series",
    subtitle = "Cada punto representa una década y el tamaño indica la cantidad de series",
    x = "Duración promedio",
    y = "Popularidad promedio",
    size = "Cantidad de series",
    color = "Década"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Este diagrama de burbujas, que compara la duración promedio de los episodios con la popularidad de las series por década, muestra que la popularidad más alta no se asocia a un patrón claro de duración. Las dos burbujas más grandes, que representan la mayor cantidad de series (décadas de 2010 y 2020), tienen una duración promedio muy similar (alrededor de 38 a 40 minutos), pero su popularidad promedio varía ligeramente. Los picos de popularidad son alcanzados por series de décadas anteriores (1990s y 1980s), cuyas burbujas son mucho más pequeñas (menos cantidad de series), con duraciones que varían entre los 25 y 35 minutos. Esto demuestra que la mayor parte del catálogo de Netflix se centra en series con episodios de duración estándar (cerca de 40 minutos), pero la popularidad extrema es un fenómeno raro y disperso, sin depender directamente de si el episodio es corto o largo.

#Correlacion del tiempo con la popularidad
correlacion_2<- cor(netflix_tmdb_series$Tiempo, netflix_tmdb_series$tmdb_popularidad, use="complete.obs")


print(correlacion_2)
## [1] 0.07661694

El resultado \(r = 07661694\) establece que no existe una relación lineal significativa entre la duración promedio de las películas y su nivel de popularidad.

5. Popularidad por país y década (gráfico de burbujas)

#Grafico de burbuja

##----------- Calcular la popularidad promedio por país y década

netflix_tmdb_pelis <- netflix_tmdb_pelis %>%
  mutate(
    Paises_produccion = str_to_lower(Paises_produccion),                     
    Paises_produccion = str_replace_all(Paises_produccion, "'", ""),
    Paises_produccion = str_trim(Paises_produccion)                          
  ) %>%
  separate_rows(Generos, sep = ",\\s*")


popularidad_pais_decada <- netflix_tmdb_pelis %>%
  group_by(decada, Paises_produccion) %>%
  summarise(
    popularidad_promedio = mean(tmdb_popularidad, na.rm = TRUE),
    cantidad = n(),
    .groups = "drop"
  )

## Calcular top 10 más y menos populares 
ranking_paises <- popularidad_pais_decada %>%
  group_by(Paises_produccion) %>%
  summarise(popularidad_global = mean(popularidad_promedio, na.rm = TRUE)) %>%
  arrange(desc(popularidad_global))

top_10_mas <- ranking_paises %>% slice_head(n = 10)
top_10_menos <- ranking_paises %>% slice_tail(n = 10)

paises_filtrados <- bind_rows(top_10_mas, top_10_menos)

## Filtrar el dataset principal 
popularidad_filtrada <- popularidad_pais_decada %>%
  filter(Paises_produccion %in% paises_filtrados$Paises_produccion)

# --- Gráfico de burbujas para ver la popularidad segun el pais y la decadas 
ggplot(popularidad_filtrada, 
       aes(x = factor(decada), 
           y = reorder(Paises_produccion, popularidad_promedio),
           size = cantidad, 
           color = popularidad_promedio)) +
  geom_point(alpha = 0.85) +
  scale_color_gradient(low = "#FF6B6B", high = "darkred") +
  scale_size(range = c(2, 10)) +
  labs(
    title = "Popularidad promedio por país y década (Top 10 mas populares y top 10menos populares)",
    subtitle = "Comparación de los países más y menos populares según TMDB",
    x = "Década",
    y = "País",
    color = "Popularidad promedio",
    size = "Cantidad de producciones"
  ) +
  theme_minimal()

Este diagrama de burbujas compara la popularidad promedio de producciones por país en las últimas dos décadas. El gráfico muestra una extrema concentración de la popularidad en las décadas de 2010 y 2020, con la década de 2000 teniendo solo un punto atípico (CZ). La mayor cantidad de producciones (tamaño de la burbuja) y los valores más altos de popularidad promedio (color rojo intenso) se asocian principalmente al código [es] (España) en ambas décadas (2010s y 2020s). Esto demuestra que las producciones de España son las más voluminosas y, en promedio, las más populares dentro de este conjunto de países. El resto de los países tiene una cantidad de producciones mucho menor y su popularidad promedio tiende a ser más baja (color rosa claro) y homogénea.

Hidden Gems

El objetivo de esta sección es identificar las producciones (películas y series) que, a pesar de tener una alta valoración crítica, presentan una baja popularidad, lo que las cataloga como “joyas ocultas” o subvaloradas dentro del catálogo.

1. Metodología de Definición de “Hidden Gems”

Para definir una producción como subvalorada, se establecieron los siguientes umbrales basados en percentiles, lo que asegura que la selección se base en la distribución real de los datos:Baja Popularidad: La popularidad de TMDB (tmdb_popularidad) debe estar por debajo del percentil 40 (\(\text{P}_{40}\)). Es decir, la producción debe ser menos popular que el 60% del catálogo.Alta Valoración: El puntaje de TMDB (tmdb_puntaje) debe ser igual o superior al percentil 60 (\(\text{P}_{60}\)). Es decir, la producción debe tener una calificación más alta que el 60% del catálogo.Este enfoque crea un filtro estricto para identificar contenido que es críticamente exitoso pero comercialmente discreto.

## --- Calculamos percentiles
p40_popularidad <- quantile(netflix_tmdb_pelis$tmdb_popularidad, 0.4, na.rm = TRUE)
p60_score <- quantile(netflix_tmdb_pelis$tmdb_puntaje, 0.6, na.rm = TRUE)


##Ahora hacemos un top 20 de las pelis subvaloradas

hidden_gems_pelis <- netflix_tmdb_pelis %>%
  filter(tmdb_popularidad < p40_popularidad & tmdb_puntaje > p60_score) %>%
  arrange(desc(tmdb_puntaje)) %>%
  slice_head(n = 20) %>%
  select(Titulos_producciones, Tipos, tmdb_popularidad, tmdb_puntaje)

print(hidden_gems_pelis)
## # A tibble: 20 × 4
##    Titulos_producciones                      Tipos tmdb_popularidad tmdb_puntaje
##    <chr>                                     <chr>            <dbl>        <dbl>
##  1 Thomas & Friends: Full Steam To The Resc… MOVIE            0.957           10
##  2 Motu Patlu Kung Fu Kings 4 The Challenge… MOVIE            1.13            10
##  3 Three Words to Forever                    MOVIE            2.04            10
##  4 Three Words to Forever                    MOVIE            2.04            10
##  5 Three Words to Forever                    MOVIE            2.04            10
##  6 Three Words to Forever                    MOVIE            2.04            10
##  7 Youth v Gov                               MOVIE            1.84            10
##  8 Octonauts and the Great Barrier Reef      MOVIE            4.12            10
##  9 Octonauts and the Great Barrier Reef      MOVIE            4.12            10
## 10 Octonauts and the Great Barrier Reef      MOVIE            4.12            10
## 11 Octonauts and the Great Barrier Reef      MOVIE            4.12            10
## 12 True: Friendship Day                      MOVIE            1.84            10
## 13 True: Friendship Day                      MOVIE            1.84            10
## 14 Kedibone                                  MOVIE            2.37            10
## 15 True: Rainbow Rescue                      MOVIE            2.41            10
## 16 Motu Patlu the Superheroes – Super Villa… MOVIE            0.89            10
## 17 Motu Patlu the Superheroes – Super Villa… MOVIE            0.89            10
## 18 Motu Patlu the Superheroes – Super Villa… MOVIE            0.89            10
## 19 Uncle Naji in UAE                         MOVIE            1.27            10
## 20 Uncle Naji in UAE                         MOVIE            1.27            10
##Grafico del top 20 de pelis
ggplot(hidden_gems_pelis, aes(x = reorder(Titulos_producciones, tmdb_puntaje),  
                              y = tmdb_puntaje)) +
  geom_col(fill = "darkred", alpha = 0.9)+
  coord_flip() +
  
  labs(
    title = "Top 20 Hidden Gems en Netflix",
    subtitle = "Producciones con alta valoración y baja popularidad",
    x = "",
    y = "Puntaje TMDB" 
  ) +
  theme_minimal()

2. Correlación entre Puntaje y Popularidad

El cálculo del coeficiente de correlación de Pearson (\(r\)) entre el puntaje de crítica (tmdb_puntaje) y la popularidad (tmdb_popularidad) es crucial para entender por qué existen las “Hidden Gems”.

#¿Cual es la correlacion del puntaje de las peliculas con su popularidad?
cor_3<- cor(netflix_tmdb_pelis$tmdb_puntaje, netflix_tmdb_pelis$tmdb_popularidad, use="complete.obs")

print(cor_3)
## [1] 0.08058732

Este valor es extremadamente bajo (muy cercano a cero), lo que indica que no existe una relación lineal significativa entre la alta valoración de una serie y su visibilidad o éxito masivo.

##-----------------Lo mismo con las series----------------

p40_popularidad_series <- quantile(netflix_tmdb_series$tmdb_popularidad, 0.4, na.rm = TRUE)
p60_score_series<- quantile(netflix_tmdb_series$tmdb_puntaje, 0.6, na.rm = TRUE)

##Ahora hacemos un top 20 de las pelis subvaloradas

hidden_gems_series <- netflix_tmdb_series %>%
  filter(tmdb_popularidad < p40_popularidad_series & tmdb_puntaje > p60_score_series) %>%
  arrange(desc(tmdb_puntaje)) %>%
  slice_head(n = 20) %>%
  select(Titulos_producciones, Tipos, tmdb_popularidad, tmdb_puntaje)

print(hidden_gems_series)
## # A tibble: 20 × 4
##    Titulos_producciones                      Tipos tmdb_popularidad tmdb_puntaje
##    <chr>                                     <chr>            <dbl>        <dbl>
##  1 Pink Zone                                 SHOW             0.682           10
##  2 Pink Zone                                 SHOW             0.682           10
##  3 Pink Zone                                 SHOW             0.682           10
##  4 Little Baby Bum                           SHOW             0.971           10
##  5 Little Baby Bum                           SHOW             0.971           10
##  6 Little Baby Bum                           SHOW             0.971           10
##  7 Dharmakshetra                             SHOW             1.24            10
##  8 Raja, Rasoi Aur Anya Kahaniyaan           SHOW             0.992           10
##  9 Raja, Rasoi Aur Anya Kahaniyaan           SHOW             0.992           10
## 10 Transformers: Rescue Bots Academy         SHOW             2.57            10
## 11 Transformers: Rescue Bots Academy         SHOW             2.57            10
## 12 Transformers: Rescue Bots Academy         SHOW             2.57            10
## 13 Transformers: Rescue Bots Academy         SHOW             2.57            10
## 14 Transformers: Rescue Bots Academy         SHOW             2.57            10
## 15 Rainbow Rangers                           SHOW             1.50            10
## 16 Rainbow Rangers                           SHOW             1.50            10
## 17 Rainbow Rangers                           SHOW             1.50            10
## 18 Unrequited Love                           SHOW             2.72            10
## 19 Falling in Love Like a Romantic Drama     SHOW             3.18            10
## 20 Loo Loo Kids Johny & Friends Musical Adv… SHOW             0.917           10
##Grafico del top 20 de pelis
ggplot(hidden_gems_series, aes(x = reorder(Titulos_producciones, tmdb_puntaje),  
                               y = tmdb_puntaje)) +
  geom_col(fill = "darkred", alpha = 0.9) +
  coord_flip() +
  
  labs(
    title = "Top 20 Hidden Gems en Netflix",
    subtitle = "Producciones con alta valoración y baja popularidad",
    x = "",
    y = "Puntaje TMDB" 
  ) +
  theme_minimal()

#¿Cual es la correlacion del puntaje de las series con su popularidad?
cor4 <- cor(netflix_tmdb_series$tmdb_puntaje, netflix_tmdb_series$tmdb_popularidad, use="complete.obs")

print(cor4)
## [1] 0.105557

No existe una relación lineal significativa entre la valoración que los usuarios dan a una serie (su puntaje) y qué tan popular se vuelve. Una serie con una alta puntuación no garantiza una alta popularidad, y una serie altamente popular no necesariamente tiene una alta puntuación. La variabilidad en la popularidad está explicada por factores ajenos a la calidad de la producción.

En conclusión, la correlación de \(r = 0.1056\) demuestra que, en el catálogo de Netflix, la calidad y el éxito de visibilidad son dos dimensiones casi independientes para las series.

En resumen, la identificación de estas “Hidden Gems” a través de los percentiles permite a Netflix identificar contenido de alta calidad que requiere una mayor visibilidad y promoción, capitalizando el potencial no aprovechado de estas producciones subvaloradas por la audiencia general.

Conclusiones

El análisis cuantitativo de la plataforma establece que la visibilidad de las producciones depende primariamente de factores de actualidad y género, y no de la calidad intrínseca del contenido.

1. Impulsores del Éxito (Popularidad)

La popularidad en Netflix está impulsada por el sesgo temporal y la temática:

Actualidad y Cantidad: El catálogo está masivamente concentrado en producciones lanzadas entre 2015 y 2020. El éxito y la alta popularidad son casi exclusivos de estas décadas recientes. La estrategia de la plataforma se basa en el volumen de contenido actual y de duración estándar (películas de \(\approx 100\) minutos, series de \(\approx 40\) minutos por episodio).

Géneros Dominantes: Los picos de popularidad son alcanzados por géneros de alto impacto como Acción, Crimen, Ciencia Ficción (Scifi) y Animación. En contraste, la producción de España ([es]) destaca como la más voluminosa y popular en promedio dentro de las producciones por país analizadas.

2. Desconexión Calidad-Popularidad

El análisis de correlación demuestra una desvinculación clave entre la valoración y el éxito masivo:

Correlación Nula (\(r \approx 0\)): La duración de las producciones (\(r \approx 0.02\) para películas; \(r \approx 0.07\) para series) y, más críticamente, la calidad crítica (Puntaje TMDB) con la Popularidad de las series (\(r = 0.1056\)) presentan una correlación insignificante.

Implicación: La alta calidad crítica no garantiza la popularidad. La visibilidad está dominada por el algoritmo y el marketing, no por el mérito.

##3. El Fenómeno de las “Hidden Gems”

La metodología de “Hidden Gems”se valida estadísticamente por esta baja correlación, identificando:

Obras Subvaloradas: Las “Gemas Ocultas” son el resultado directo de la desconexión: producciones con alta valoración (\(\text{Puntaje} > \text{P}_{60}\)) que han sido invisibles (\(\text{Popularidad} < \text{P}_{40}\)).

Conclusión: La promoción algorítmica y editorial debe enfocarse en este segmento subvalorado para corregir el ciclo de visibilidad desigual y capitalizar la calidad crítica existente en el catálogo.